package com.mark.web.bill.mapper;

import com.mark.web.bill.entity.po.Account;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Description: 账号到dao接口定义
 * @Author: Kingsley: 08：46
 * @CreateDate: 2019/1/31 15:14
 * @Version: 2.0
 * @Copyright : 豆浆油条个人非正式工作室
 */
public interface AccountMapper {

    int insert(Account record);

    int deleteByPrimaryKey(Integer id);

    int deleteByPrimaryKeyAndUserId(@Param("id") Integer id, @Param("currentUserId") int currentUserId);

    int updateByPrimaryKeySelective(Account record);

    /**
     * 批量更新账单信息
     *
     * @param idList        ：账单id列表
     * @param currentUserId ：当前用户id
     * @param paymentDate ：结算的支付时间
     * @param status ：账单的支付状态
     * @return ：
     */
    int batchUpdateStatusByIds(@Param("idList") List<Integer> idList,
                               @Param("currentUserId") int currentUserId,
                               @Param("status") int status,
                               @Param("paymentDate") Date paymentDate);

    /**
     * 根据搜索时间和账单更新账单的支付记录
     * @param startDate ：账单创建时间的起始时间
     * @param endDate ：账单创建时间的结算时间
     * @param currentUserId ：当前用户id
     * @param status ：支付的状态值
     * @param paymentDate ：支付时间
     * @return ：
     */
    int batchUpdateStatusByDateRange(@Param("startDate") Date startDate,
                                     @Param("endDate") Date endDate,
                                     @Param("currentUserId") int currentUserId,
                                     @Param("status") int status,
                                     @Param("paymentDate") Date paymentDate);

    Account selectByPrimaryKey(Integer id);

    /**
     * 根据搜索的时间戳获取个人的账单信息
     *
     * @param startDate     ：开始时间
     * @param endDate       ： 结束时间
     * @param currentUserId ：当用用户id
     * @return ：
     */
    List<Account> selectAccountsBySearchTime(@Param("startDate") Date startDate,
                                             @Param("endDate") Date endDate,
                                             @Param("currentUserId") int currentUserId);


    /**
     * 统计搜搜是按范围内的不同组状态账单的总价
     *
     * @param startDate     ：开始时间
     * @param endDate       ：结束时间
     * @param state         ：状态，结算，为结束，全部
     * @param currentUserId ：当前用户 Id
     * @return ：
     */
    BigDecimal getTotalPrice(@Param("startDate") Date startDate,
                             @Param("endDate") Date endDate,
                             @Param("state") Integer state,
                             @Param("currentUserId") int currentUserId);

    /**
     * 获取搜索时间范围内的完成的加工零件的个数
     *
     * @param startDate     ：搜搜开始时间
     * @param endDate       ：搜索结束时间
     * @param currentUserId ：当前用户id
     * @return ：
     */
    Integer getTotalQuantity(@Param("startDate") Date startDate,
                             @Param("endDate") Date endDate,
                             @Param("currentUserId") int currentUserId);

    /**
     * 查询当前用户按照天数分组查询价格在搜索时间范围内数据
     *
     * @param startDate     ：搜搜开始时间
     * @param endDate       ：搜索结束时间
     * @param currentUserId ：当前用户id
     * @return ：
     * 注意趋势图差查看结果需要制定别名，count和type
     */
    List<Map<String, Object>> selectAccountLineDate(@Param("startDate") Date startDate,
                                                    @Param("endDate") Date endDate,
                                                    @Param("currentUserId") int currentUserId);

    /**
     * 查询当前用户按照天数分组查询每天加工的零件个数搜索时间范围内
     *
     * @param startDate：搜索开始时间
     * @param endDate          ：搜索结束时间
     * @param currentUserId    ：当前用户id
     * @return ：
     * 注意趋势图差查看结果需要制定别名，count和type
     */
    List<Map<String, Object>> selectAccountLineQuantityDate(@Param("startDate") Date startDate,
                                                            @Param("endDate") Date endDate,
                                                            @Param("currentUserId") int currentUserId);

}